import md5 from "./MD5.js";
import Big from "./big.js";
function createNewPassword(origin_password,encrypt_factor='',password_number=6,type=[["0","1","2","3","4","5","6","7","8","9"]]){
	// $ascii=self::getChar($format);
	// var ascii_map={"33":"!","34":"\"","35":"#","36":"$","37":"%","38":"&","39":"'","40":"(","41":")","42":"*","43":"+","44":",","45":"-","46":".","47":"/","48":"0","49":"1","50":"2","51":"3","52":"4","53":"5","54":"6","55":"7","56":"8","57":"9","58":":","59":";","60":"<","61":"=","62":">","63":"?","64":"@","65":"A","66":"B","67":"C","68":"D","69":"E","70":"F","71":"G","72":"H","73":"I","74":"J","75":"K","76":"L","77":"M","78":"N","79":"O","80":"P","81":"Q","82":"R","83":"S","84":"T","85":"U","86":"V","87":"W","88":"X","89":"Y","90":"Z","91":"[","92":"\\","93":"]","94":"^","95":"_","96":"`","97":"a","98":"b","99":"c","100":"d","101":"e","102":"f","103":"g","104":"h","105":"i","106":"j","107":"k","108":"l","109":"m","110":"n","111":"o","112":"p","113":"q","114":"r","115":"s","116":"t","117":"u","118":"v","119":"w","120":"x","121":"y","122":"z","123":"{","124":"|","125":"}","126":"~"};
	// var n_map=["0","1","2","3","4","5","6","7","8","9"];
	// var o_map=["!","\"","#","$","%","&","'","(",")","*","+",",","-",".","/",":",";","<","=",">","?","@","[","\\","]","^","_","`","{","|","}","~"];
	// var a_map=["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"];
	
	var ascii_map = [];
	console.log(type);
	for (var i in type) {
		ascii_map = ascii_map.concat(type[i]);
	}
	// var verify_type=type;
	var verify_type=[];
	for (var i in type) {
		verify_type[i] = type[i];
	}
	
	console.log(verify_type);
	password_number=password_number?password_number:origin_password.length;
	var encrypt_str=origin_password+password_number+encrypt_factor;
	console.log(encrypt_str);console.log(ascii_map);
	var password='';
	// var offset=array_search(reset(ascii_map),ascii_map);//偏移量33
	// var offset=33;
	var scope=0;
	// scope=ascii_map.length;
	for(var i in ascii_map) {
		scope++;
	}
	//字符范围94
	// if(){
		// console.log(this.hex2int('e10adc3949ba59abbe56e057f20f8872')==this.hex2int('e20adc3949ba59abbe56e057f20f883e'));
	// }
	
	for (var i=0; i <password_number ; i++) {
		// console.log(encrypt_str);
		encrypt_str=md5.hexMD5(encrypt_str);//原密码进行md5加密
		var int=hex2int(encrypt_str);//16转10进制
		var ys_str=int.mod(scope);//求余数
		// console.log(ys_str);console.log(1);
		var ascii=ys_str.toNumber();//新密码第i个值的ascii
		// var ascii=this.tonumber(ys_str)+offset;//新密码第i个值的ascii
		password+=ascii_map[ascii];//通过ascii获得密码的字符
	}
	// todo验证密码复杂度，考虑是否重新生成
	var password_arr = password.split("");
	var verify_result=true;
	// var verify_type=['N','C'];
	var not_exist_type=verify_type;
	for(var i=0; i <password_arr.length ; i++) {
		if(not_exist_type.length>0){
			for(var j=0; j <not_exist_type.length ; j++) {
				if(not_exist_type[j].indexOf(password_arr[i])>=0){
					not_exist_type.splice(j, 1); 
					break;
				}
			}
		}else{
			break;
		}
	}

	if(not_exist_type.length>0){
		verify_result=false;
	}

	if(!verify_result){
		password=createNewPassword(origin_password,encrypt_factor+password,password_number,type);
	}
	return password;
	
	// new Big(0.1)
	// y = x.plus(0.2)+
	// x.minus(0.1) -
	// x.times(3)  *
	// x.div(y)  /
	// x.mod(0.9)%
	// x.toNumber() 
}
function tonumber(big){
	var ret1='';
	for(var i in big.c){
		ret1+=big.c[i];
	}
	return parseInt(ret1);
}
function hex2int(hex) {
	var hex_map={'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9,'a':10,'b':11,'c':12,'d':13,'e':14,'f':15};
	var int_end = new Big(0);
	var hex_str=hex.split("");
	for(var i in hex_str) {
		var int_now=new Big(0);
		int_now=int_now.plus(hex_map[hex_str[i]]);
		if(i!=hex_str.length-1){
			for (var j = 0; j < hex_str.length-1-i; j++) {
				int_now=int_now.times(16);
			}
		}
		int_end=int_end.plus(int_now);
	}
	return int_end;
}
module.exports = {
  createNewPassword: createNewPassword
}